From a1574f0660662f24588da3c5d0616d2f7e46b960 Mon Sep 17 00:00:00 2001 From: Elle Stone Date: Fri, 21 Sep 2018 08:40:33 -0400 Subject: [PATCH] CIE: Add xyY color space conversions Issue #22 --- extensions/CIE.c | 724 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 668 insertions(+), 56 deletions(-) diff --git a/extensions/CIE.c b/extensions/CIE.c index d4d033d..1c8b70c 100644 --- a/extensions/CIE.c +++ b/extensions/CIE.c @@ -56,6 +56,9 @@ #define D50_WHITE_REF_Y 1.000000000f #define D50_WHITE_REF_Z 0.824905400f +#define NEAR_ZERO 0.0000000001f +#define D50_WHITE_REF_x 0.345702921222f +#define D50_WHITE_REF_y 0.358537532290f static void types (void); @@ -88,6 +91,9 @@ components (void) babl_component_new ("CIE X", NULL); babl_component_new ("CIE Y", NULL); babl_component_new ("CIE Z", NULL); + babl_component_new ("CIE x", NULL); + babl_component_new ("CIE y", NULL); +/* babl_component_new ("CIE z", NULL);*/ } static void @@ -137,6 +143,21 @@ models (void) babl_component ("CIE Z"), babl_component ("A"), NULL); + + babl_model_new ( + "name", "CIE xyY", + babl_component ("CIE x"), + babl_component ("CIE y"), + babl_component ("CIE Y"), + NULL); + + babl_model_new ( + "name", "CIE xyY alpha", + babl_component ("CIE x"), + babl_component ("CIE y"), + babl_component ("CIE Y"), + babl_component ("A"), + NULL); } static void rgbcie_init (void); @@ -169,6 +190,22 @@ static inline void LAB_to_XYZ (double L, double *to_Z ); +static inline void XYZ_to_xyY (double X, + double Y, + double Z, + double *to_x, + double *to_y, + double *to_Y + ); + +static inline void xyY_to_XYZ (double x, + double y, + double Y, + double *to_X, + double *to_Y, + double *to_Z + ); + static inline void XYZ_to_LAB (double X, double Y, @@ -216,6 +253,52 @@ LAB_to_XYZ (double L, *to_Z = zr * D50_WHITE_REF_Z; } + +static inline void +XYZ_to_xyY (double X, + double Y, + double Z, + double *to_x, + double *to_y, + double *to_Y) +{ + if ( X < NEAR_ZERO && Y < NEAR_ZERO && Z < NEAR_ZERO ) + { *to_Y = 0.0; + *to_x = D50_WHITE_REF_x; + *to_y = D50_WHITE_REF_y; + } + else + { + *to_x = X / (X + Y + Z); + *to_y = Y / (X + Y + Z); + *to_Y = Y; + } +} + +static inline void +xyY_to_XYZ (double x, + double y, + double Y, + double *to_X, + double *to_Y, + double *to_Z) +{ + if ( Y < NEAR_ZERO ) + { *to_X = 0.0; + *to_Y = 0.0; + *to_Z = 0.0; + } + else + { + *to_X = (x * Y) / y; + *to_Y = Y; + *to_Z = ((1 - x - y) * Y) / y; + } +} + + +/* rgb <-> XYZ */ + static void rgba_to_xyz (const Babl *conversion,char *src, char *dst, @@ -282,6 +365,447 @@ xyza_to_rgba (const Babl *conversion,char *src, } +/* rgb -> xyY */ + +static void +rgba_to_xyY (const Babl *conversion,char *src, + char *dst, + long n) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + while (n--) + { + double XYZ[3], x, y, Y; + + babl_space_to_xyz (space, (double*)src, XYZ); + XYZ_to_xyY (XYZ[0], XYZ[1], XYZ[2], &x, &y, &Y); + + ((double *) dst)[0] = x; + ((double *) dst)[1] = y; + ((double *) dst)[2] = Y; + + src += sizeof (double) * 4; + dst += sizeof (double) * 3; + } +} + +static void +rgba_to_xyYa (const Babl *conversion,char *src, + char *dst, + long n) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + while (n--) + { + double alpha = ((double *) src)[3]; + double XYZ[3], x, y, Y; + + //convert RGB to XYZ + babl_space_to_xyz (space, (double*)src, XYZ); + + //convert XYZ to xyY + XYZ_to_xyY (XYZ[0], XYZ[1], XYZ[2], &x, &y, &Y); + + ((double *) dst)[0] = x; + ((double *) dst)[1] = y; + ((double *) dst)[2] = Y; + ((double *) dst)[3] = alpha; + + src += sizeof (double) * 4; + dst += sizeof (double) * 4; + } +} + +static void +rgbaf_to_xyYaf (const Babl *conversion, + float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X; + float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X; + float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X; + float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y; + float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y; + float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y; + float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z; + float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z; + float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float x, y, X, Y, Z, r, g, b, a; + r = src[0]; + g = src[1]; + b = src[2]; + a = src[3]; + + if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO ) + { + Y = 0.0f; + x = D50_WHITE_REF_x; + y = D50_WHITE_REF_y; + } + + else + { + X = m_0_0 * r + m_0_1 * g + m_0_2 * b; + Y = m_1_0 * r + m_1_1 * g + m_1_2 * b; + Z = m_2_0 * r + m_2_1 * g + m_2_2 * b; + + x = X / (X + Y + Z); + y = Y / (X + Y + Z); + } + + dst[0] = x; + dst[1] = y; + dst[2] = Y; + dst[3] = a; + + src += 4; + dst += 4; + } +} + +static void +rgbf_to_xyYf (const Babl *conversion,float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X; + float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X; + float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X; + float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y; + float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y; + float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y; + float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z; + float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z; + float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float x, y, X, Y, Z, r, g, b; + r = src[0]; + g = src[1]; + b = src[2]; + + if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO ) + { + Y = 0.0f; + x = D50_WHITE_REF_x; + y = D50_WHITE_REF_y; + } + + else + { + X = m_0_0 * r + m_0_1 * g + m_0_2 * b; + Y = m_1_0 * r + m_1_1 * g + m_1_2 * b; + Z = m_2_0 * r + m_2_1 * g + m_2_2 * b; + + x = X / (X + Y + Z); + y = Y / (X + Y + Z); + } + + dst[0] = x; + dst[1] = y; + dst[2] = Y; + + src += 3; + dst += 3; + } +} + + +static void +rgbaf_to_xyYf (const Babl *conversion, + float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.RGBtoXYZf[0] / D50_WHITE_REF_X; + float m_0_1 = space->space.RGBtoXYZf[1] / D50_WHITE_REF_X; + float m_0_2 = space->space.RGBtoXYZf[2] / D50_WHITE_REF_X; + float m_1_0 = space->space.RGBtoXYZf[3] / D50_WHITE_REF_Y; + float m_1_1 = space->space.RGBtoXYZf[4] / D50_WHITE_REF_Y; + float m_1_2 = space->space.RGBtoXYZf[5] / D50_WHITE_REF_Y; + float m_2_0 = space->space.RGBtoXYZf[6] / D50_WHITE_REF_Z; + float m_2_1 = space->space.RGBtoXYZf[7] / D50_WHITE_REF_Z; + float m_2_2 = space->space.RGBtoXYZf[8] / D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float x, y, X, Y, Z, r, g, b; + r = src[0]; + g = src[1]; + b = src[2]; + + if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO ) + { + Y = 0.0f; + x = D50_WHITE_REF_x; + y = D50_WHITE_REF_y; + } + + else + { + X = m_0_0 * r + m_0_1 * g + m_0_2 * b; + Y = m_1_0 * r + m_1_1 * g + m_1_2 * b; + Z = m_2_0 * r + m_2_1 * g + m_2_2 * b; + + x = X / (X + Y + Z); + y = Y / (X + Y + Z); + } + + dst[0] = x; + dst[1] = y; + dst[2] = Y; + + src += 4; + dst += 4; + } +} + + +/* xyY -> rgb */ + +static void +xyY_to_rgba (const Babl *conversion,char *src, + char *dst, + long n) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + while (n--) + { + double x = ((double *) src)[0]; + double y = ((double *) src)[1]; + double Y = ((double *) src)[2]; + + double R, G, B, X, Z; + + //convert xyY to XYZ + xyY_to_XYZ (x, y, Y, &X, &Y, &Z); + + //convert XYZ to RGB + { + double XYZ[3] = {X,Y,Z}; + double RGB[3]; + babl_space_from_xyz (space, XYZ, RGB); + R = RGB[0]; + G = RGB[1]; + B = RGB[2]; + } + + ((double *) dst)[0] = R; + ((double *) dst)[1] = G; + ((double *) dst)[2] = B; + ((double *) dst)[3] = 1.0; + + src += sizeof (double) * 3; + dst += sizeof (double) * 4; + } +} + + +static void +xyYa_to_rgba (const Babl *conversion,char *src, + char *dst, + long n) +{ + const Babl *space = babl_conversion_get_destination_space (conversion); + while (n--) + { + double x = ((double *) src)[0]; + double y = ((double *) src)[1]; + double Y = ((double *) src)[2]; + double alpha = ((double *) src)[3]; + + double X, Z; + + //convert xyY to XYZ + xyY_to_XYZ (x, y, Y, &X, &Y, &Z); + + { + //convert XYZ to RGB + double XYZ[3] = {X,Y,Z}; + babl_space_from_xyz (space, XYZ, (double*)dst); + } + ((double *) dst)[3] = alpha; + + src += sizeof (double) * 4; + dst += sizeof (double) * 4; + } +} + + +static void +xyYf_to_rgbf (const Babl *conversion,float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X; + float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y; + float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z; + float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X; + float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y; + float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z; + float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X; + float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y; + float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float X, Z, r, g, b; + float x = src[0]; + float y = src[1]; + float Y = src[2]; + + + if ( Y < NEAR_ZERO ) + { + X = 0.0f; + Y = 0.0f; + Z = 0.0f; + } + else + { + X = (x * Y) / y; + Y = Y; + Z = ((1 - x - y) * Y) / y; + } + + r = m_0_0 * X + m_0_1 * Y + m_0_2 * Z; + g = m_1_0 * X + m_1_1 * Y + m_1_2 * Z; + b = m_2_0 * X + m_2_1 * Y + m_2_2 * Z; + + dst[0] = r; + dst[1] = g; + dst[2] = b; + + src += 3; + dst += 3; + } +} + + + +static void +xyYf_to_rgbaf (const Babl *conversion, + float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X; + float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y; + float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z; + float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X; + float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y; + float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z; + float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X; + float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y; + float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float X, Z, r, g, b; + float x = src[0]; + float y = src[1]; + float Y = src[2]; + + + if ( Y < NEAR_ZERO ) + { + X = 0.0f; + Y = 0.0f; + Z = 0.0f; + } + else + { + X = (x * Y) / y; + Y = Y; + Z = ((1 - x - y) * Y) / y; + } + + r = m_0_0 * X + m_0_1 * Y + m_0_2 * Z; + g = m_1_0 * X + m_1_1 * Y + m_1_2 * Z; + b = m_2_0 * X + m_2_1 * Y + m_2_2 * Z; + + dst[0] = r; + dst[1] = g; + dst[2] = b; + dst[3] = 1.0f; + + src += 4; + dst += 4; + } +} + +static void +xyYaf_to_rgbaf (const Babl *conversion, + float *src, + float *dst, + long samples) +{ + const Babl *space = babl_conversion_get_source_space (conversion); + float m_0_0 = space->space.XYZtoRGBf[0] * D50_WHITE_REF_X; + float m_0_1 = space->space.XYZtoRGBf[1] * D50_WHITE_REF_Y; + float m_0_2 = space->space.XYZtoRGBf[2] * D50_WHITE_REF_Z; + float m_1_0 = space->space.XYZtoRGBf[3] * D50_WHITE_REF_X; + float m_1_1 = space->space.XYZtoRGBf[4] * D50_WHITE_REF_Y; + float m_1_2 = space->space.XYZtoRGBf[5] * D50_WHITE_REF_Z; + float m_2_0 = space->space.XYZtoRGBf[6] * D50_WHITE_REF_X; + float m_2_1 = space->space.XYZtoRGBf[7] * D50_WHITE_REF_Y; + float m_2_2 = space->space.XYZtoRGBf[8] * D50_WHITE_REF_Z; + long n = samples; + + while (n--) + { + float X, Z, r, g, b; + float x = src[0]; + float y = src[1]; + float Y = src[2]; + float a = src[3]; + + + if ( Y < NEAR_ZERO ) + { + X = 0.0f; + Y = 0.0f; + Z = 0.0f; + } + else + { + X = (x * Y) / y; + Y = Y; + Z = ((1 - x - y) * Y) / y; + } + + r = m_0_0 * X + m_0_1 * Y + m_0_2 * Z; + g = m_1_0 * X + m_1_1 * Y + m_1_2 * Z; + b = m_2_0 * X + m_2_1 * Y + m_2_2 * Z; + + dst[0] = r; + dst[1] = g; + dst[2] = b; + dst[3] = a; + + src += 4; + dst += 4; + } +} + + +/* rgb <-> LAB */ + static void rgba_to_lab (const Babl *conversion,char *src, char *dst, @@ -305,7 +829,6 @@ rgba_to_lab (const Babl *conversion,char *src, } - static void lab_to_rgba (const Babl *conversion,char *src, char *dst, @@ -400,6 +923,9 @@ laba_to_rgba (const Babl *conversion,char *src, } } + +/* rgb <-> LCh */ + static inline void CHab_to_ab (double C, double H, @@ -1426,6 +1952,8 @@ rgbaf_to_Labaf_sse2 (const Babl *conversion, const float *src, float *dst, long static void conversions (void) { + /* babl_model */ + babl_conversion_new ( babl_model ("RGBA"), babl_model ("CIE Lab"), @@ -1444,28 +1972,91 @@ conversions (void) "linear", rgba_to_laba, NULL ); - babl_conversion_new ( + babl_conversion_new ( babl_model ("CIE Lab alpha"), babl_model ("RGBA"), "linear", laba_to_rgba, NULL ); babl_conversion_new ( - babl_format ("RGB float"), - babl_format ("CIE Lab float"), - "linear", rgbf_to_Labf, + babl_model ("RGBA"), + babl_model ("CIE LCH(ab)"), + "linear", rgba_to_lchab, NULL ); babl_conversion_new ( - babl_format ("CIE Lab float"), - babl_format ("RGB float"), - "linear", Labf_to_rgbf, + babl_model ("CIE LCH(ab)"), + babl_model ("RGBA"), + "linear", lchab_to_rgba, + NULL + ); + babl_conversion_new ( + babl_model ("RGBA"), + babl_model ("CIE LCH(ab) alpha"), + "linear", rgba_to_lchaba, + NULL + ); + babl_conversion_new ( + babl_model ("CIE LCH(ab) alpha"), + babl_model ("RGBA"), + "linear", lchaba_to_rgba, + NULL + ); + babl_conversion_new ( + babl_model ("RGBA"), + babl_model ("CIE XYZ"), + "linear", rgba_to_xyz, + NULL + ); + babl_conversion_new ( + babl_model ("CIE XYZ"), + babl_model ("RGBA"), + "linear", xyz_to_rgba, + NULL + ); + babl_conversion_new ( + babl_model ("RGBA"), + babl_model ("CIE XYZ alpha"), + "linear", rgba_to_xyza, + NULL + ); + babl_conversion_new ( + babl_model ("CIE XYZ alpha"), + babl_model ("RGBA"), + "linear", xyza_to_rgba, + NULL + ); + babl_conversion_new ( + babl_model ("RGBA"), + babl_model ("CIE xyY"), + "linear", rgba_to_xyY, + NULL + ); + babl_conversion_new ( + babl_model ("CIE xyY"), + babl_model ("RGBA"), + "linear", xyY_to_rgba, + NULL + ); + babl_conversion_new ( + babl_model ("RGBA"), + babl_model ("CIE xyY alpha"), + "linear", rgba_to_xyYa, + NULL + ); + babl_conversion_new ( + babl_model ("CIE xyY alpha"), + babl_model ("RGBA"), + "linear", xyYa_to_rgba, NULL ); + + /* babl_format */ + babl_conversion_new ( + babl_format ("RGB float"), babl_format ("CIE Lab float"), - babl_format ("RGBA float"), - "linear", Labf_to_rgbaf, + "linear", rgbf_to_Labf, NULL ); babl_conversion_new ( @@ -1480,6 +2071,18 @@ conversions (void) "linear", rgbaf_to_Labaf, NULL ); + babl_conversion_new ( + babl_format ("CIE Lab float"), + babl_format ("RGB float"), + "linear", Labf_to_rgbf, + NULL + ); + babl_conversion_new ( + babl_format ("CIE Lab float"), + babl_format ("RGBA float"), + "linear", Labf_to_rgbaf, + NULL + ); babl_conversion_new ( babl_format ("CIE Lab alpha float"), babl_format ("RGBA float"), @@ -1522,30 +2125,6 @@ conversions (void) "linear", Labaf_to_Lf, NULL ); - babl_conversion_new ( - babl_model ("RGBA"), - babl_model ("CIE LCH(ab)"), - "linear", rgba_to_lchab, - NULL - ); - babl_conversion_new ( - babl_model ("CIE LCH(ab)"), - babl_model ("RGBA"), - "linear", lchab_to_rgba, - NULL - ); - babl_conversion_new ( - babl_model ("RGBA"), - babl_model ("CIE LCH(ab) alpha"), - "linear", rgba_to_lchaba, - NULL - ); - babl_conversion_new ( - babl_model ("CIE LCH(ab) alpha"), - babl_model ("RGBA"), - "linear", lchaba_to_rgba, - NULL - ); babl_conversion_new ( babl_format ("CIE Lab float"), babl_format ("CIE LCH(ab) float"), @@ -1571,27 +2150,39 @@ conversions (void) NULL ); babl_conversion_new ( - babl_model ("RGBA"), - babl_model ("CIE XYZ"), - "linear", rgba_to_xyz, + babl_format ("RGB float"), + babl_format ("CIE xyY float"), + "linear", rgbf_to_xyYf, NULL ); babl_conversion_new ( - babl_model ("CIE XYZ"), - babl_model ("RGBA"), - "linear", xyz_to_rgba, + babl_format ("CIE xyY float"), + babl_format ("RGB float"), + "linear", xyYf_to_rgbf, NULL ); babl_conversion_new ( - babl_model ("RGBA"), - babl_model ("CIE XYZ alpha"), - "linear", rgba_to_xyza, + babl_format ("RGBA float"), + babl_format ("CIE xyY float"), + "linear", rgbaf_to_xyYf, NULL ); babl_conversion_new ( - babl_model ("CIE XYZ alpha"), - babl_model ("RGBA"), - "linear", xyza_to_rgba, + babl_format ("CIE xyY float"), + babl_format ("RGBA float"), + "linear", xyYf_to_rgbaf, + NULL + ); + babl_conversion_new ( + babl_format ("RGBA float"), + babl_format ("CIE xyY alpha float"), + "linear", rgbaf_to_xyYaf, + NULL + ); + babl_conversion_new ( + babl_format ("CIE xyY alpha float"), + babl_format ("RGBA float"), + "linear", xyYaf_to_rgbaf, NULL ); @@ -1675,6 +2266,27 @@ formats (void) babl_component ("A"), NULL); + babl_format_new ( + "name", "CIE LCH(ab) float", + babl_model ("CIE LCH(ab)"), + + babl_type ("float"), + babl_component ("CIE L"), + babl_component ("CIE C(ab)"), + babl_component ("CIE H(ab)"), + NULL); + + babl_format_new ( + "name", "CIE LCH(ab) alpha float", + babl_model ("CIE LCH(ab) alpha"), + + babl_type ("float"), + babl_component ("CIE L"), + babl_component ("CIE C(ab)"), + babl_component ("CIE H(ab)"), + babl_component ("A"), + NULL); + babl_format_new ( "name", "CIE L float", babl_model ("CIE Lab"), @@ -1715,23 +2327,23 @@ formats (void) NULL); babl_format_new ( - "name", "CIE LCH(ab) float", - babl_model ("CIE LCH(ab)"), + "name", "CIE xyY float", + babl_model ("CIE xyY"), babl_type ("float"), - babl_component ("CIE L"), - babl_component ("CIE C(ab)"), - babl_component ("CIE H(ab)"), + babl_component ("CIE x"), + babl_component ("CIE y"), + babl_component ("CIE Y"), NULL); babl_format_new ( - "name", "CIE LCH(ab) alpha float", - babl_model ("CIE LCH(ab) alpha"), + "name", "CIE xyY alpha float", + babl_model ("CIE xyY alpha"), babl_type ("float"), - babl_component ("CIE L"), - babl_component ("CIE C(ab)"), - babl_component ("CIE H(ab)"), + babl_component ("CIE x"), + babl_component ("CIE y"), + babl_component ("CIE Y"), babl_component ("A"), NULL); } -- 2.30.2